package com.straw.hat.jdk.jvm.classes;

import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;

import java.util.ArrayList;
import java.util.List;

public class ObjTest {

    /*2*/
    /**
     * @param args
     * @throws InterruptedException
     *
     * class加载没有影响 堆的内存使用在上升(对象在Eden S1/S0 Old中出现溢出) meta使用有微量的变化
     *1.触发GC
     *
     * -XX:MaxMetaspaceSize=10M -Xmx50M -Xm50M
     * jstat -gc 8428 100 100
     */
//    public static void main(String[] args) throws InterruptedException {
//        Thread.sleep(15*1000);
//        List<ClassTest> list = new ArrayList();
//        for (int i = 0; i < 10000000*2; i++) {
//            list.add(new ClassTest());
//        }
//    }

    /*2*/
    /**
     * @param args
     * @throws InterruptedException
     *
     * class加载没有影响 堆的内存使用在上升(对象在Eden S1/S0 Old中出现溢出) meta使用有微量的变化
     *1.触发GC
     *-Xmx10M -Xms10M  //GC overhead limit exceeded (超过98%的时间用来做GC并且回收了不到2%的堆内存时会抛出此异常。)
     * 2，JVM给出这样一个参数：-XX:-UseGCOverheadLimit  禁用这个检查，其实这个参数解决不了内存问题，只是把错误的信息延后，替换成 java.lang.OutOfMemoryError: Java heap space。
     * 也就是说有检查会出现GC overhead limit exceeded 去掉检查就是  java.lang.OutOfMemoryError: Java heap space
     * 实际上就是堆溢出
     * jstat -gc 8428 100 100
     */
    public static void main(String[] args) throws InterruptedException {
//        Thread.sleep(15*1000);
        List<Object> list = new ArrayList();
        for (int i = 0; i < 10000000*2; i++) {
            Enhancer enhancer = new Enhancer();
            enhancer.setSuperclass(ObjTest.class);
            enhancer.setUseCache(false);
            enhancer.setCallback((MethodInterceptor) (o, method, objects, methodProxy) -> methodProxy.invokeSuper(o, args));
            list.add(enhancer.create());
        }
    }
}
